package myjava.n_scriptEngine;

import javax.script.Invocable;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.net.URL;
import java.util.List;

/**
 * @Auther: cty
 * @Date: 2020/4/13 18:42
 * @Description:  脚本引擎（JDK6.0添加）
 * @version: 1.0
 */
public class ScriptEngine {
    public static void main(String[] args) throws ScriptException {
        //获得脚本引擎
        ScriptEngineManager sem = new ScriptEngineManager();
        javax.script.ScriptEngine engine = sem.getEngineByName("javascript");


        System.out.println("1 执行脚本运算");
        System.out.println(engine.eval("1+2"));
        System.out.println(engine.eval("var a=1;var b=5;a+b"));
        System.out.println("****************************************************************");


        System.out.println("2 变量操作");
        //向引擎上下文中定义一个变量（Java和脚本都可以访问）
        engine.put("msg", "cty is a good man!");

        // Java获取引擎上下文中的变量
        System.out.println(engine.get("msg"));
        // 脚本获取引擎上下文中的变量
        engine.eval("print(msg)");

        // 修改引擎上下文中的变量
        engine.eval("msg='whu is a good school!'");
        System.out.println(engine.get("msg"));
        System.out.println("****************************************************************");


        System.out.println("3 调用脚本函数");
        // 定义函数
        engine.eval("function add (a, b) {var sum = a + b; return sum; }");
        // 取得调用接口
        Invocable jsInvoke = (Invocable) engine;
        //执行脚本中定义的方法
        Object result1 = null;
        try {
            result1 = jsInvoke.invokeFunction("add", new Object[] { 13, 20 });
            System.out.println(result1);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        System.out.println("****************************************************************");

        System.out.println("4 调用脚本文件");
        //执行一个js文件(我们将a.js至于项目的src下即可)
        URL is = null;
        Reader r = null;
        try {
            is = ScriptEngine.class.getClassLoader().getResource("a.js");
            r = new FileReader(is.getPath());
            engine.eval(r);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                r.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println("****************************************************************");


        System.out.println("5 脚本中导入Java包，并调用改包中Java类的方法");
        String jsCode = "var list = java.util.Arrays.asList([\"武汉大学\",\"清华大学\",\"北京大学\"]); ";
        engine.eval(jsCode);
        List<String> list2 = (List<String>) engine.get("list");
        for (String temp : list2) {
            System.out.println(temp);
        }
        System.out.println("****************************************************************");


    }
}

/* res: 2020年4月13日
1 执行脚本运算
3
6.0
****************************************************************
2 变量操作
cty is a good man!
cty is a good man!
whu is a good school!
****************************************************************
3 调用脚本函数
33.0
****************************************************************
4 调用脚本文件
invoke js file:7
****************************************************************
5 脚本中导入Java包，并调用改包中Java类的方法
武汉大学
清华大学
北京大学
****************************************************************
*/
